/*
 * @lc app=leetcode.cn id=503 lang=cpp
 *
 * [503] 下一个更大元素 II
 */

// @lc code=start

#include <limits.h>

#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <vector>
using namespace std;

class Solution {
   public:
    vector<int> nextGreaterElements(vector<int>& nums) {
        int length = nums.size();
        vector<int> result(length, -1);
        stack<int> st;  // 由下标组成的单调栈

        for (int i = 0; i < 2 * length + 1; i++) {
            // 如果当前元素大于栈顶元素，则栈顶元素出栈
            while (!st.empty() && nums[i % length] > nums[st.top()]) {
                result[st.top()] = nums[i % length];
                st.pop();
            }
            st.push(i % length);
        }
        return result;
    }
};
// @lc code=end
